package role

import (
	"go-caipu/pkg/services/admin/dept"
	"go-caipu/pkg/services/admin/model"
	"go-caipu/pkg/services/dto"
	"go-caipu/pkg/util"
)

type Role struct {
	RoleId    int64    `json:"id,string" comment:"角色编码"` // 角色编码
	RoleName  string   `json:"name" comment:"角色名称"`      // 角色名称
	Status    int      `json:"status" comment:"状态"`      // 状态
	RoleKey   string   `json:"code" comment:"角色代码"`      // 角色代码
	RoleSort  int      `json:"sort" comment:"角色排序"`      // 角色排序
	Flag      string   `json:"flag" comment:"标记"`        // 标记
	Remark    string   `json:"description" comment:"备注"` // 备注
	Admin     bool     `json:"isSystem" comment:"是否管理员"`
	DataScope int      `json:"dataScope"`
	MenuIds   []string `json:"menuIds"`
	DeptIds   []string `json:"deptIds"`
	CreatedAt string   `json:"createTime"`
}

type GetRolePageCommand struct {
	dto.Pagination `search:"-"`
	RoleName       string `form:"description" search:"type:contains;column:role_name;table:sys_role" comment:"角色名称"` // 角色名称
	Status         string `form:"status" search:"type:exact;column:status;table:sys_role" comment:"状态"`              // 状态
	RoleKey        string `form:"roleKey" search:"type:exact;column:role_key;table:sys_role" comment:"角色代码"`         // 角色代码
}

func (m *GetRolePageCommand) GetNeedSearch() interface{} {
	return *m
}

type SysRoleInsertReq struct {
	RoleId    int64    `json:"id" comment:"角色编码"`        // 角色编码
	RoleName  string   `json:"name" comment:"角色名称"`      // 角色名称
	Status    int      `json:"status" comment:"状态"`      // 状态
	RoleKey   string   `json:"code" comment:"角色代码"`      // 角色代码
	RoleSort  int      `json:"sort" comment:"角色排序"`      // 角色排序
	Flag      string   `json:"flag" comment:"标记"`        // 标记
	Remark    string   `json:"description" comment:"备注"` // 备注
	DataScope int      `json:"dataScope"`
	MenuIds   []string `json:"menuIds"`
	DeptIds   []string `json:"deptIds"`
	dto.ControlBy
}

func (s *SysRoleInsertReq) Generate(model *model.SysRole) {
	model.RoleId = s.RoleId
	model.RoleName = s.RoleName
	model.Status = s.Status
	model.RoleKey = s.RoleKey
	model.Sort = s.RoleSort
	model.Flag = s.Flag
	model.Remark = s.Remark
	model.DataScope = util.IntToString(s.DataScope)
	model.MenuIds = s.MenuIds
	model.DeptIds = s.DeptIds
}

type SysRoleUpdateReq struct {
	RoleId    int64    `uri:"id" comment:"角色编码"`         // 角色编码
	RoleName  string   `json:"name" comment:"角色名称"`      // 角色名称
	Status    int      `json:"status" comment:"状态"`      // 状态
	RoleKey   string   `json:"code" comment:"角色代码"`      // 角色代码
	RoleSort  int      `json:"sort" comment:"角色排序"`      // 角色排序
	Flag      string   `json:"flag" comment:"标记"`        // 标记
	Remark    string   `json:"description" comment:"备注"` // 备注
	DataScope int      `json:"dataScope"`
	MenuIds   []string `json:"menuIds"`
	DeptIds   []string `json:"deptIds"`
	dto.ControlBy
}

func (s *SysRoleUpdateReq) Generate(model *model.SysRole) {
	if s.RoleId != 0 {
		model.RoleId = s.RoleId
	}
	model.RoleName = s.RoleName
	model.Status = s.Status
	model.RoleKey = s.RoleKey
	model.Sort = s.RoleSort
	model.Flag = s.Flag
	model.Remark = s.Remark

	model.DataScope = util.IntToString(s.DataScope)
	model.MenuIds = s.MenuIds
	model.DeptIds = s.DeptIds
}

type UpdateStatusReq struct {
	RoleId int64 `form:"roleId,string" comment:"角色编码"` // 角色编码
	Status int   `form:"status" comment:"状态"`          // 状态
	dto.ControlBy
}

func (s *UpdateStatusReq) Generate(model *model.SysRole) {
	if s.RoleId != 0 {
		model.RoleId = s.RoleId
	}
	model.Status = s.Status
}

type SysRoleByName struct {
	RoleName string `form:"role"` // 角色编码
}

type GetRoleCommand struct {
	Id int `uri:"roleId"`
}

func (s *GetRoleCommand) GetId() interface{} {
	return s.Id
}

type SysRoleDeleteReq struct {
	Ids []int `json:"ids"`
}

func (s *SysRoleDeleteReq) GetId() interface{} {
	return s.Ids
}

// UpdateDataScopeCommand 角色数据权限修改
type UpdateDataScopeCommand struct {
	RoleId    int64    `json:"roleId" binding:"required"`
	DataScope string   `json:"dataScope" binding:"required"`
	DeptIds   []string `json:"deptIds"`
}

func (s *UpdateDataScopeCommand) Generate(model *model.SysRole) {
	if s.RoleId != 0 {
		model.RoleId = s.RoleId
	}
	model.DataScope = s.DataScope
	model.DeptIds = s.DeptIds
}

type DataScopeResp struct {
	Dept        []dept.TreeDept `json:"dept"`
	CheckedKeys []string        `json:"checkedKeys"`
}

type DelRoleCommand struct {
	Ids []string `json:"ids"`
}

type UpdateRolePermissionCommand struct {
	RoleId  int64    `uri:"id" comment:"角色编码"` // 角色编码
	MenuIds []string `json:"menuIds"`
}
